package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

/**
 * * @author hennebrueder This class garanties that only one single
 * SessionFactory * is instanciated and that the configuration is done thread
 * safe as * singleton. Actually it only wraps the Hibernate SessionFactory. *
 * You are free to use any kind of JTA or Thread transactionFactories.
 */
public class SessionFactoryUtil {
	/** The single instance of hibernate SessionFactory */
	private static org.hibernate.SessionFactory sessionFactory;

	/** * disable contructor to guaranty a single instance */
	private SessionFactoryUtil() {
	}

	static {
		// Annotation and XML
		sessionFactory = new AnnotationConfiguration().configure()
				.buildSessionFactory();// XML only//
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}

	public static SessionFactory getInstance() {
		return sessionFactory;
	}

	/**
	 * * Opens a session and will not bind it to a session context * @return the
	 * session
	 */
	public Session openSession() {
		return sessionFactory.openSession();
	}

	/**
	 * * Returns a session from the session context. If there is no session in
	 * the context it opens a session, * stores it in the context and returns
	 * it. * This factory is intended to be used with a hibernate.cfg.xml *
	 * including the following property &lt;property *
	 * name="current_session_context_class"&gt;thread&lt;/property&gt; This would
	 * return * the current open session or if this does not exist, will create a
	 * new * session * * @return the session
	 */
	public Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	/** * closes the session factory */
	public static void close() {
		if (sessionFactory != null)
			sessionFactory.close();
		sessionFactory = null;
	}
}
